package com.itheima.service.Impl;

import com.itheima.anno.MyLog;
import com.itheima.mapper.DeptMapper;
import com.itheima.mapper.EmpMapper;
import com.itheima.pojo.Dept;
import com.itheima.pojo.DeptLog;
import com.itheima.service.DeptLogService;
import com.itheima.service.DeptService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 部门业务实现类 ，进行业务逻辑处理
 */
@Service
@Slf4j
public class DeptServiceImpl implements DeptService {


    @Autowired
    private DeptMapper deptMapper;

    @Autowired
    private EmpMapper empMapper;

    @Autowired
    private DeptLogService deptLogService;


    /**
     * 查询所有部门信息
     *
     * @return 存储Dept对象的集合
     */
    public List<Dept> list() {
        List<Dept> deptList = deptMapper.list();
        return deptList;
    }

    /**
     * 根据部门id，删除部门信息及部门下的所有员工
     *
     * @param id 部门id
     */
    @MyLog
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void delete(Integer id) throws Exception{
        try {
            //根据部门id删除部门信息
            deptMapper.delete(id);
            //删除部门下的所有员工信息
            empMapper.deleteByDeptId(id);
        } finally {
            //不论是否有异常，最终都要执行的代码：记录日志
            DeptLog deptLog = new DeptLog();
            deptLog.setCreateTime(LocalDateTime.now());
            deptLog.setDescription("执行了解散部门的操作，此时解散的是"+id+"号部门");
            //调用其他业务类中的方法
            deptLogService.insert(deptLog);
        }
    }

    /**
     * 新增一个部门
     *
     * @param dept 部门对象
     */
    @Override
    @MyLog
    public void save(Dept dept) {
        //补全部门数据
        dept.setCreateTime(LocalDateTime.now());
        dept.setUpdateTime(LocalDateTime.now());
        //调用持久层的功能
        deptMapper.save(dept);
    }

    /**
     * 根据ID查询部门数据
     *
     * @param id 部门的id
     */
    @Override
    public Dept selectById(Number id) {
        //调用持久层的功能
        Dept dept = deptMapper.selectById(id);
        return dept;
    }

    /**
     * 根据id和name修改部门数据
     */
    @Override
    @MyLog
    public void update(Dept dept) {
        //更新部门数据，修改日期
        dept.setUpdateTime(LocalDateTime.now());
        //调用持久层的功能
        deptMapper.update(dept);
    }
}
